﻿//主框架代码开始
(function ($, undefined) {
    var form = (function () {
        var form = function (selector, context) {//调用$(selector)时,实际是调用这个函数.
            return new form.fn.init(selector, context);
        };
        //实例方法开始
        form.fn = {
            constructor: form,
            init: function (selector, context) {
                this.jo = $(selector, context);
                return this;
            }
        };
        form.prototype = form.fn;
        //实例方法结束
        form.fn.init.prototype = form.fn;
        //静态方法开始

        //静态成员结束
        return form; //这个form就是$form
    })();
    window.form = window.$form = form;
})(jQuery);
//主框架代码结束

//静态方法开始
$.extend($form, {

});
//静态方法结束

//实例方法开始
$form.fn.select = function (options) {
    var _this = $(this.jo);
    var obj = function () {
        this.options =$.extend({data:[]}, options);
    }
    obj.prototype.getValue = function () {
        var _val = $('input', _this).val();
        var _val2 = parseInt(_val, 10);
        if (_val2 == 0 || _val2) {
            return _val2;
        }
        return _val;
    }
    obj.prototype.setValue = function () {
        var _obj = this;
        var _val = arguments[0];
        $('input', _this).val(_val);
        $.each($('li', _obj.panel), function (i, o) {
            if ($(o).attr('value') == _val) {
                $('.kui-form-sltitle span', _this).html($('a', $(o)).html());
            }
        });
    }
    obj.prototype.change = function () {
        var _obj = this;
        if (_obj.options.onChange) {
            _obj.options.onChange(_obj.panel.find('li[value="' + _obj.getValue() + '"]')[0], $c.array.first(_obj.options.data, function (i, o) { return o.value == _obj.getValue(); }))
        }
    }
    obj.prototype.create = function () {
        var _obj = this;
        _this.html('');
        _this.addClass('kui-form-select');
        var _input = $('<input type="hidden" name="' + _obj.options.name + '" value=""/>').appendTo(_this);
        //if (_obj.options.value != null && _obj.options.value != undefined) {
        //    $(_input).val(options.value);
        //}
        var _titleHtml = $('<div class="kui-form-sltitle"></div>').appendTo(_this);
        var selectedItem = $c.array.first(_obj.options.data, function (i, o) { return o.value == _obj.options.value; });

        var _title = '';
        if (selectedItem) {
            _title = selectedItem.text;
            $(_input).val(selectedItem.value);
        }
        _titleHtml.append('<span>' + _title + '</span><i class="kui-edge"></i>');

        var _ul = $('<ul class="kui-form-option" style="position:fixed;z-index:'+($g.zIndex++)+'; display:none"></ul>').appendTo('body');
        _obj.panel = _ul;

        _titleHtml.click(function (e) {
            if ($(_ul).is(":hidden")) {
                e.stopPropagation();//使$(document).click不执行.
                _ul.show();
                _ul.css('left', _this.offset().left);
                _ul.css('top', _this.offset().top + _this.height() + parseInt(_this.css('border-top-width').split('px')[0], 10) + parseInt(_this.css('border-bottom-width').split('px')[0], 10));
                _ul.css('width', _this.width());
                if (_ul.offset().top + _ul.height()+20 > $(document).height()) {
                    _ul.css('top', _this.offset().top-_ul.height());//上方显示.
                }
            }
        });

        $.each(_obj.options.data, function (i, o) {
            var _item = $('<li value="' + o.value + '"><a href="javascript:void(0);">' + o.text + '</a></li>').appendTo(_ul);
            _item.click(function (e) {
                var oldValue = $(_input).val();
                $(_input).val(o.value);
                $('span', _titleHtml).html(o.text);
                if (oldValue != o.value && _obj.options.onChange) {
                    _obj.options.onChange(this, o);
                }
                _ul.hide();
            });
        });
        //绑定页面点击事件
        $(document).click(function (e) {
            _obj.panel.hide();
        });
    }
    var _obj = new obj();
    _obj.create();
    return _obj;
    
}//singleSelect结束

$form.fn.checkbox = function (options) {//options:{name,data,value,onChange}
    var _this = $(this.jo);
    var obj = function () {
        this.options = options;
    }
    obj.prototype.getValue = function () {
        return $c.array.select($('input', _this).val().split(','), function (i, _val) {
            var _val2 = parseInt(_val, 10);
            if (_val2 == 0 || _val2) {
                return _val2;
            }
            return _val;
        });
    }
    obj.prototype.setValue = function (values) {
        $('input', _this).val('');
        if (values == null || values == undefined) {
            return;
        }
        var valList = [];
        $('.kui-form-checkbox-item', _this).removeClass('checked');
        $.each($('.kui-form-checkbox-item', _this), function (i, o) {
            $.each(values, function (j, v) {
                if ($(o).attr('value') == v) {
                    $(o).addClass('kui-checked');
                    valList.push(v);//例如：只有1、2、3三选项,setValue([1,2,3,4,5])还是只将值设为1,2,3.
                }
            });
        });
        $('input', _this).val(valList.join(','));
        return;
    }
    obj.prototype.change = function () {
        var _obj = this;
        if (_obj.options.onChange) {
            var values = [];
            $.each(_obj.options.data, function (i, o) {
                $.each(_this.find('.kui-form-checkbox-item'),function(j,elem){
                    if (elem.value == o.value&&$(elem).hasClass('kui-checked')) {
                        values.push(o);
                    }
                })
            })
            _obj.options.onChange(null, values);
        }
    }
    obj.prototype.create = function () {
        var _obj = this;
        _this.html('');
        _this.addClass('kui-form-checkbox');
        var _input = $('<input type="hidden" name="' + _obj.options.name + '" value=""/>').appendTo(_this);
        var valList = [];
        $.each(_obj.options.data, function (i, o) {
            var _item = $('<div value="' + o.value + '" class="kui-form-checkbox-item"><label>' + o.text + '</label><i class="iconfont kui-nochecked"></i><i class="iconfont icon-check kui-checked"></i></div>').appendTo(_this);

            if (_obj.options.i_width) {
                _item.find('i.kui-nochecked,i.kui-checked').css('width', _obj.options.i_width);
            } else {
                _item.find('i.kui-nochecked').css('width', _item.find('i.kui-checked').width());
            }
            _item.find('i.kui-nochecked').css('height', _item.find('i.kui-checked').height());

            if (_obj.options.countPerLine > 0) {
                if ((i + 1) % _obj.options.countPerLine == 0) {
                    _this.append('<div style="clear:both; font-size:0px; height:0px; overflow:hidden;"><div>');
                }
                if ((i + 1) % _obj.options.countPerLine == 1) {
                    _item.addClass('kui-line-start')
                }
            }
            if (i == 0) {
                _item.addClass('kui-first');
            }
            if (_obj.options.value != null && _obj.options.value != undefined) {
                $.each(_obj.options.value, function (j, v) {
                    if (o.value == v) {
                        _item.addClass('kui-checked');
                        valList.push(v);
                    }
                });
            }
            _item.click(function () {
                if (_obj.options.disabled) {
                    return;
                }
                _item.toggleClass('kui-checked');
                var newValues = [];
                $.each(_obj.options.data, function (_k, _v) {
                    $.each($('.kui-form-checkbox-item', _this), function (_i, _item) {
                        if (_v.value == $(_item).attr('value') && $(_item).hasClass('kui-checked')) {
                            newValues.push(_v);
                        }
                    });
                });

                $(_input).val($c.array.select(newValues, function (__n, __o) { return __o.value }).join(','));
                if (_obj.options.onChange) {
                    _obj.options.onChange(this, newValues);
                }
            });
        });

        $(_input).val(valList.join(','));
        _this.append('<div style="clear:both; font-size:0px; height:0px; overflow:hidden;"><div>');
    }

    var _obj = new obj();
    _obj.create();
    return _obj;
    
}//checkbox结束

$form.fn.radio = function (options) {//options:{name,data,value,onChange}
    var _obj = this;
    var _this = $(this.jo);
    var obj = function () {
        this.options = options;
    }
    obj.prototype.getValue = function () {
        return parseInt($('input', _this).val(), 10);
    }
    obj.prototype.setValue = function (val) {
        $('input', _this).val('');
        $('.kui-form-radio-item', _this).removeClass('kui-checked');
        $.each($('.kui-form-radio-item', _this), function (i, o) {
            if ($(o).attr('value') == val) {
                $(o).addClass('kui-checked');
                $('input', _this).val(val);//只有要设置的值在选项中存在时才设置值.
            }
        });
        return;
    }
    obj.prototype.change = function () {
        var _obj = this;
        if (_obj.options.onChange) {
            _obj.options.onChange(_this.find('div[value=' + _obj.getValue() + ']')[0], $c.array.first(_obj.options.data, function (i, o) { return o.value == _obj.getValue(); }))
        }
    }
    obj.prototype.create = function () {
        _this.html('');
        _this.addClass('kui-form-radio');
        var _input = $('<input type="hidden" name="' + _obj.options.name + '" value=""/>').appendTo(_this);
        $.each(options.data, function (i, o) {
            var _item = $('<div value="' + o.value + '" class="kui-form-radio-item"><label>' + o.text + '</label><i class="iconfont icon-yuanxingweixuanzhong kui-nochecked"></i><i class="iconfont icon-danxuan kui-checked"></i></div>').appendTo(_this);;
            if (_obj.options.countPerLine > 0) {
                if ((i + 1) % _obj.options.countPerLine == 0) {
                    _this.append('<div style="clear:both; font-size:0px; height:0px; overflow:hidden;"><div>');
                }
                if ((i + 1) % _obj.options.countPerLine ==1) {
                    _item.addClass('kui-line-start')
                }
            }
            if (i == 0) {
                _item.addClass('kui-first');
            }

            if (o.value == _obj.options.value) {
                _item.addClass('kui-checked');
                //if (options.value != null && options.value != undefined) {
                $(_input).val(_obj.options.value);//只有要设置的值在选项中存在时才设置值.
                //}
            }
            _item.click(function () {
                if (_obj.options.disabled) {
                    return;
                }
                var oldValue = $(_input).val();
                $(_input).val(o.value);
                $('.kui-form-radio-item', _this).removeClass('kui-checked');
                _item.addClass('kui-checked');
                //$('i', item).html('&#xe71f;');
                if (oldValue != o.value && _obj.options.onChange) {
                    _obj.options.onChange(this, o);
                }
            });
        });
        _this.append('<div style="clear:both; font-size:0px; height:0px; overflow:hidden;"><div>');
    }
    
    var _obj = new obj();
    _obj.create();
    return _obj;
    
}//radio结束

//实例方法结束